﻿-------------------------------------------------------------------------------------------------------------
-------------------------------------------pca_caja.movimientos----------------------------------------------
-------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_caja.fn_add_movimiento(varchar,--empresa_id $1
						      varchar,--oficina_id $2
						      bigint,--grupo_movimiento_id $3
						      bigint,--subgrupo_movimiento_id $4
						      bigint,--sesion_id $5
						      date,--fecha $6
						      bigint,--liquidacion_id $7
						      character,--usuario_id $8
						      varchar,--detalle $9
						      varchar,--moneda_id $10
						      numeric --monto $11
						      )RETURNS bigint AS
$$
DECLARE
	_row_diario pca_caja.diarios%ROWTYPE;
	_row_liquidacion pca_caja.liquidaciones%ROWTYPE;
BEGIN
	--verificamos que exista el registro de caja diario y que no este cerrado
	SELECT
		*
	INTO
		_row_diario
	FROM
		pca_caja.resumen_diarios
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		fecha = $6;

	IF FOUND THEN
		IF _row_diario.cerrado THEN
			RAISE EXCEPTION 'La caja diaria se encuentra cerrada para la fecha %', $6;
		END IF;
	ELSE
		PERFORM pca_caja.fn_add_diario($1,$2,$6);
	END IF;

	--Verificamos que exista la liquidacion y no este cerrado solo si es diferente de NULL

	IF $7 NOTNULL THEN
		SELECT
			*
		INTO
			_row_liquidacion
		FROM
			pca_caja.liquidaciones
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			liquidacion_id = $7 AND
			usuario_id = $8;

		IF FOUND THEN
			IF _row_liquidacion.cerrado THEN
				RAISE EXCEPTION 'La liquidacion se encuentra cerrada y no se puede modificar, comuniquese con su supervisor';
			END IF;
		ELSE
			RAISE EXCEPTION 'Error interno al validar el identificador de liquidacion, comuniquese con el centro de computo';
		END IF;
	END IF;

	INSERT INTO pca_caja.movimientos
		(empresa_id,
		oficina_id,
		grupo_movimiento_id,
		subgrupo_movimiento_id,
		sesion_id,
		fecha,
		liquidacion_id,
		usuario_id,
		detalle,
		moneda_id,
		monto) 
	VALUES
		($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);

	RETURN  pca_global.fn_pseudo_encrypt_bigint(currval('pca_caja.seq_movimiento_id')::integer);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_update_movimiento(varchar,--empresa_id $1
							 varchar,--oficina_id $2
							 bigint,--movimiento_id $3
							 bigint,--grupo_movimiento_id $4
							 bigint,--subgrupo_movimiento_id $5 
							 bigint,--sesion_id $6
							 varchar,--detalle $7
							 varchar,--moneda_id $8
							 numeric --monto $9
							 )RETURNS void AS
$$
DECLARE
	_row pca_caja.vw_movimientos%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_caja.vw_movimientos
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		movimiento_id = $3;

	IF FOUND THEN
		IF _row.cerrado_caja_diaria THEN
			RAISE EXCEPTION 'La caja diaria se encuentra cerrada para la fecha %, la operacion "Actualizar" fue cancelada', _row.fecha;
		END IF;

		IF _row.liquidacion_id NOTNULL THEN
			IF _row.cerrado_liquidacion THEN
				RAISE EXCEPTION 'La liquidacion se encuentra cerrada y no se puede modificar, la operacion "Actualizar" fue cancelada, comuniquese con su supervisor';
			END IF;
		END IF;
	ELSE
		RAISE EXCEPTION 'El movimiento ya no existe en la base de datos, posiblemente fue eliminado, actualice su ventana';
	END IF;
	
	UPDATE pca_caja.movimientos SET
		grupo_movimiento_id = $4,
		subgrupo_movimiento_id = $5, 
		sesion_id = $6,
		detalle = $7,
		moneda_id = $8,
		monto = $9
	WHERE
		movimiento_id = $3;
END
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_del_movimiento(varchar,--empresa_id $1
						      varchar,--oficina_id $2
						      bigint --movimiento_id $3
						      )RETURNS void AS
$$
DECLARE
	_row pca_caja.vw_movimientos%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_caja.vw_movimientos
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		movimiento_id = $3;

	IF FOUND THEN
		IF _row.cerrado_caja_diaria THEN
			RAISE EXCEPTION 'La caja diaria se encuentra cerrada para la fecha %, la operacion "Eliminar" fue cancelada', _row.fecha;
		END IF;

		IF _row.liquidacion_id NOTNULL THEN
			IF _row.cerrado_liquidacion THEN
				RAISE EXCEPTION 'La liquidacion se encuentra cerrada y no se puede modificar, la operacion "Eliminar" fue cancelada, comuniquese con su supervisor';
			END IF;
		END IF;
	ELSE
		RAISE EXCEPTION 'El movimiento ya no existe en la base de datos, posiblemente ya fue eliminado, actualice su ventana';
	END IF;


	DELETE FROM pca_caja.movimientos WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		movimiento_id = $3;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_movimiento(varchar,--empresa_id $1
						      varchar,--oficina_id $2
						      bigint --movimiento_id $3
						      )RETURNS SETOF pca_caja.vw_movimientos AS
$$
DECLARE
	_row pca_caja.vw_movimientos%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_caja.vw_movimientos
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			movimiento_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_movimientos(integer,--start $1
							    integer,--limit $2
							    varchar,--empresa_id $3
							    varchar,--oficina_id $4
							    date --fecha $5
							    )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_caja.vw_movimientos
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			fecha = $5
		ORDER BY
			fecha_hora_sistema ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_caja.vw_movimientos
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			fecha = $5;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_movimientos(integer,--start $1
							    integer,--limit $2
							    varchar,--empresa_id $3
							    varchar,--oficina_id $4
							    bigint,--liquidacion_id $5
							    varchar --detalle $6
							    )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_caja.vw_movimientos
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			liquidacion_id = $5 AND
			lower(pca_global.fn_ascii(detalle)) LIKE '%'|| lower(pca_global.fn_ascii($6)) ||'%'
		ORDER BY
			fecha_hora_sistema ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_caja.vw_movimientos
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			liquidacion_id = $5 AND
			lower(pca_global.fn_ascii(detalle)) LIKE '%'|| lower(pca_global.fn_ascii($6)) ||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

